#include <iostream>
using namespace std;

typedef int ElemType;

struct StackNode {
    ElemType data;
    struct StackNode * next;
};

typedef StackNode * LinkStack;

bool InitStack(LinkStack &S)
{
    S = NULL;
    return true;
}

bool Push(LinkStack &S, ElemType &e)
{
    StackNode * temp = (LinkStack) malloc(sizeof(StackNode));
    temp->data = e;	
    temp->next = S;		// 将新结点插入栈顶
    S = temp;			// 修改栈顶指针
    return true;
}

bool Pop(LinkStack &S, ElemType &e)
{
    if (S == NULL)  
        return false;
    StackNode * temp;   // temp 是一个工具，为了销毁栈顶元素
    e = S->data;
    temp = S;			// 1. 用temp临时保存栈顶空间，以备释放
    S = S->next;		// 2. 修改栈顶指针
    free(temp);			// 3. 释放原栈顶元素的空间
    return true;
}

bool CreateStack(LinkStack &S, int n)
{
    for (int i = 0; i < n; i++)
    {
        ElemType input;
        cin >> input;
        if (!Push(S, input))
        {
            cout << "Push error!" << endl;
            return false;
        }
    }
    return true;
}

// 获取栈长
int StakLenght(LinkStack &S)
{
    int length = 0;
    LinkStack temp = S;

    while (temp != NULL)
    {
        length++;
        temp = temp->next;
    }

    return length;
}

// 判断栈空
bool IsEmpty(LinkStack &S)
{
    if (S == NULL)
        return true;
    else
        return false;
}

// 取栈顶元素
ElemType GetTop(LinkStack S)
{
    if (S != NULL)
        return S->data;
}

// // 清空栈
// bool ClearStack(LinkStack &S)
// {
//     while (S->next == NULL)
//         return false;
//     StackNode * q;
//     StackNode * p = S->next;
//     while (p)
//     {
//         q = p;
//         p = p->next;
//         free(q);
//     }
//     S->data = 0;
//     S->next = NULL;

//     return true;
// }

// // 销毁栈
// bool DestoryStack(LinkStack &S)
// {
//     if (S)
//         return false;
//     while(S)
//     {
//         StackNode * temp = S;
//         S = S->next;
//         free(temp);
//     }

//     return true;
// }

int main()
{
    LinkStack S;
    InitStack(S);
    CreateStack(S, 5);
    cout << "栈的长度：" << StakLenght(S) << endl;
}